package com.xinchao.common.util;

import com.xinchao.common.constant.DateFormatConstant;
import org.apache.commons.lang3.StringUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;

/**
 * 日期工具类
 */
public class DateUtils {

	public static final String PATTEN_YMD_HMS = "yyyy-MM-dd HH:mm:ss";
	public static final String PATTEN_YMD = "yyyy-MM-dd";
	public static final String PATTEN_YMD1 = "yyyy/MM/dd";
	public static final String PATTEN_YMD_HMS1 = "yyyy/MM/dd HH:mm:ss";

	/**
	 * 把long类型日期转化为格式化字符串日期
	 *
	 * @param longTimeStamp long类型时间戳
	 * @param pattern       格式
	 * @return String(格式化后的日期)
	 */
	public static String longTimeStampToStringDate(Long longTimeStamp, String pattern) {
		if (longTimeStamp == null || StringUtils.isBlank(pattern)) {
			throw new NullPointerException("时间戳或格式类型不能为空");
		}
		Date date = new Date(longTimeStamp);
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
		String formatDate = simpleDateFormat.format(date);
		return formatDate;
	}

	/**
	 * 把字符串日期转换为LonG类型日期
	 *
	 * @param time    字符串日期
	 * @param pattern 格式
	 * @return Long日期
	 * @throws ParseException
	 */
	public static Long stringTimeToLongTimeStamp(String time, String pattern) throws ParseException {
		if (StringUtils.isBlank(time) || StringUtils.isBlank(pattern)) {
			throw new NullPointerException("时间或格式类型不能为空");
		}
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
		Long formateDate = simpleDateFormat.parse(time).getTime();
		return formateDate;
	}

	/**
	 * 时间范围转换为开始时间和结束时间
	 *
	 * @param dateRange 时间范围
	 * @return HashMap<Object   ,       O   bject>
	 */
	public static HashMap<Object, Long> dateRangeToString(String dateRange, String pattern) throws ParseException {
		HashMap<Object, Long> resultMap = new HashMap<>(2);
		Long startTime = null;
		Long endTime = null;
		if (StringUtils.isNotBlank(dateRange)) {
			String[] dateRangeArr = dateRange.split("-");
			String startTimeStr = dateRangeArr[0];
			String endTimeStr = dateRangeArr[1];
			if (StringUtils.isNotBlank(startTimeStr)) {
				startTime = stringTimeToLongTimeStamp(startTimeStr, pattern);
				endTime = stringTimeToLongTimeStamp(endTimeStr, pattern);
			}
		}
		resultMap.put("startTime", startTime);
		resultMap.put("endTime", endTime);
		return resultMap;
	}

	/**
	 * 获取任意时间下一个月
	 *
	 * @param dateL 任意时间
	 * @return
	 */
	public static Long getPreMonth(Long dateL) {
		Calendar cal = Calendar.getInstance();
		cal.setTimeInMillis(dateL);
		cal.add(Calendar.MONTH, 1);
		return cal.getTimeInMillis();
	}

	/**
	 * 获取上一个月
	 *
	 * @param year  年
	 * @param month 月
	 * @return String（格式化的时间）
	 */
	public static String getLastDateOfMonth(int year, int month, String pattern) {
		if (StringUtils.isBlank(pattern)) {
			throw new NullPointerException("时间格式类型不能为空");
		}
		// 得到一个Calendar的实例
		Calendar calendar = Calendar.getInstance();
		// 月份是从0开始的，所以月份需要减1
		calendar.set(year, month - 1, 17);
		// 月份减1，就是上一月份
		calendar.add(Calendar.MONTH, -1);
		Date date = calendar.getTime();
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
		return simpleDateFormat.format(date);
	}

	/**
	 * 获取近期六个月数据(包含本月)
	 *
	 * @param year  年
	 * @param month 月份
	 * @return @return String[]
	 */
	public static String[] getNearSixMonth(int year, int month) {
		if (month >= 1 && month <= 12) {
			String[] sixMonthArray = new String[6];
			//将本月放入第一个
			if (month >= 10) {
				sixMonthArray[0] = year + "" + month;
			} else {
				sixMonthArray[0] = year + "0" + month;
			}
			for (int i = 1; i < 6; i++) {
				String lastDateOfMonth = getLastDateOfMonth(year, month, DateFormatConstant.DATE_YEAR_MONTH);
				sixMonthArray[i] = lastDateOfMonth;
				//如果月份为1月份，则需要从前一年的12月份算，所以月份就为12，年份需要减1
				if (month == 1) {
					month = 12;
					year = year - 1;
				} else {
					month--;
				}
			}
			return sixMonthArray;
		} else {
			return new String[0];
		}
	}

}